package cn.edu.sdjzu.knoverse.service;

import cn.edu.sdjzu.knoverse.model.entity.kg.KnowledgeNode;
import cn.edu.sdjzu.knoverse.model.vo.kg.KnowledgeTreeVO;
import cn.edu.sdjzu.knoverse.model.vo.result.PageResult;

import java.util.List;
import java.util.Set;

public interface KnowledgeService {

    List<KnowledgeNode> getAllKnowledge();

    /**
     * 获取知识点列表（分页）
     * @param name 知识点名称
     * @param summary 知识点概述
     * @param level 难度级别
     * @param courseId 课程ID
     * @param currentPage 当前页
     * @param pageSize 每页大小
     * @return 分页结果
     */
    PageResult<KnowledgeNode> getKnowledgeList(String name, String summary, Integer level, Long courseId, Integer currentPage, Integer pageSize);

    /**
     * 创建知识点
     * @param knowledge 知识点信息
     * @param courseId 课程ID
     * @return 创建后的知识点
     */
    KnowledgeNode createKnowledge(KnowledgeNode knowledge, Long courseId);

    /**
     * 修改知识点
     * @param knowledge 知识点信息
     * @return 修改后的知识点
     */
    KnowledgeNode updateKnowledge(KnowledgeNode knowledge);

    /**
     * 删除知识点
     * @param id 知识点ID
     */
    void deleteKnowledge(Long id);

    /**
     * 获取知识点详情
     * @param id 知识点ID
     * @return 知识点详情
     */
    KnowledgeNode getKnowledge(Long id);

    /**
     * 获取课程下的所有知识点
     * @param courseId 课程ID
     * @return 知识点列表
     */
    Set<KnowledgeNode> getKnowledgeByCourse(Long courseId);

    /**
     * 获取知识点的前置知识点
     * @param knowledgeId 知识点ID
     * @return 前置知识点列表
     */
    Set<KnowledgeNode> getPreKnowledge(Long knowledgeId);

    /**
     * 更新知识点的前置知识点
     * @param knowledgeId 知识点ID
     * @param preKnowledgeIds 前置知识点ID列表
     */
    void updatePreKnowledge(Long knowledgeId, List<Long> preKnowledgeIds);
    
    /**
     * 获取所有知识点的树形结构数据，按课程分组
     * @param excludeKnowledgeId 排除的知识点ID，可为null
     * @return 知识点树形结构数据
     */
    List<KnowledgeTreeVO> getKnowledgeTree(Long excludeKnowledgeId);

    /**
     * 获取指定教师教授的课程的知识点树形结构
     * @param teacherId 教师ID
     * @param excludeKnowledgeId 排除的知识点ID，可为null
     * @return 知识点树形结构数据
     */
    List<KnowledgeTreeVO> getKnowledgeTreeByTeacherId(Long teacherId, Long excludeKnowledgeId);
} 